crackmeUK UKさんのソース
この度、 UKさんからソースを頂きました♪ これを参考にしてみんなでkgを作ってみましょう♪ ======================================================================================================= UKさんのソース ======================================================================================================= /* strの指しているポイントから4文字 16進数かチェックしながら文字から数字へ 変える関数*/ int myatoi(char* str) { for(int i=0;i<4;i++){ if(0x30 <= str[i] && str[i] <= 0x39) str[i] -= 0x30; else if(0x41 <= str[i] && str[i] <=0x46) str[i] -= 0x37; else return 0; } return 1; } /*構造体*/ typedef struct { char* s; DWORD id; } STRID; int CheckMiddle() { char buf[100]; memset(buf,0,100); GetDlgItem(IDC_EDIT1)->GetWindowText(buf,100); /*16文字か*/ if(strlen(buf)!=16) return 0; /*最初の2文字がCRか*/ if(strncmp(buf,"CR",2)!=0) return 0; /*決められた場所にハイフンがあるか*/ if(buf[6] != '-' || buf[11] !='-') return 0; /*16進の数字かチェックしながら数字へ*/ for(int i=0;i<3;i++){ if(!myatoi(&buf[2+5*i])) return 0; } /*にっくきスレッド(笑)*/ STRID strid; strid.s = buf; strid.id = m_sirial; /*スレッド作成*/ CWinThread *pThread=AfxBeginThread(ThreadCheck,(LPVOID)&strid, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); /*スレッドの終了時にオブジェクトを自動的に削除しない*/ pThread->m_bAutoDelete=FALSE; /*これでスレッドの開始*/ pThread->ResumeThread(); /*スレッドが終了するまでまつ Ollyが止まるとはしらなった。(笑)*/ ::WaitForSingleObject(pThread->m_hThread,INFINITE); DWORD result; /*スレッドの返り値をresultに格納*/ ::GetExitCodeThread(pThread->m_hThread,&result); /*スレッドの削除*/ delete pThread; if(result) MyMessageBox("Congratulations!!! "); } /*ちぇく部分 すでに、数字部分は、文字から数字へ変わっています。* PASS CR@ABC-DEFG-HIJK ID [1][2][3][4][5][6][7][8]*/ UINT __cdecl ThreadCheck(LPVOID pParam) { char* str = ((STRID*)pParam)->s; DWORD id = ((STRID*)pParam)->id; DWORD m0,m1,m2; UCHAR a,b,c,d; //m = @ABC m0=0; for(int i=0;i<4;i++){ m0 <<= 4; m0 += str[2+i]&0xff; } //a = @A xor [1][2] a = (str[7]<<4)+str[8]; a^= (id>>24)&0xff; //b = BC xor [3][4] b = (str[9]<<4)+str[10]; b^= (id>>16)&0xff; //c = DE xor [5][6] c = (str[12]<<4)+str[13]; c^= (id>>8)&0xff; //d = FG xor [7][8] d = (str[14]<<4)+str[15]; d^= id&0xff; /* m0 = a*a*a + b*b*b = c*c*c + d*d*d ならクリア 二通りの3乗の和で表せる数を求めればよい*/ /*1通りで表されているときはじく*/ if(a == c || a==d) return 0; m1 = a*a*a+b*b*b; m2 = c*c*c+d*d*d; if(m1 != m2) return 0; if(m0 == m2) return 1; else return 0; }